#ifndef MODELOPORFRAMOJ_H
#define MODELOPORFRAMOJ_H
//
#include <QAbstractItemModel>
#include "miasuplementoqt.h"
//
  const int Framo = 1;
  const int ListoPrafilo = 2;
  const int Tipo = 3;
  const int Elemento = 4;
//
class QDomDocument;
//! Класс модели данных дерева фреймов.
/*! Данный класс реализует парадигму модель-представление. Унаследован от QAbstractItemModel, что позволяет использовать его совместно с другими классами Qt.
 * Данные представлены в виде древовидной структуры. Корневая таблица содержит два столбца. Каждой строке соответствует один фрейм корневого уровня. Первая ячейка содержит имя фрейма. Содержащаяся в ней таблица второго уровня - список полей фрейма имеет 2 столбца. Вторая ячейка пуста. Служит только для прикрепления таблицы второго уровня, содержащей фреймы-потомки. эта таблица организована подобно таблице корневого уровня.
 * Список полей фрейма состоит из слотов, демонов и служебных функций. Первый столбец содержит тип поля. Поддерживаются все типы предусмотренные QVariant, а так же два специальных: демон, служебная функция. Второй содержит данные. Для слотов уникальное имя и значение, текст на QtScript.
 * Для всех элементов есть данные с ролью Qt::TipoRolo. Они сообщяют тип элемента: Framo - фрейм(первый столбец списка фреймов); ListoPrafilo - ячейка второго столбца, пустая, но владеет списком потомков; Tipo - тип элемента фрейма; Elemento - элемент фрейма. В слоте для доступа к значению используются Qt::DisplayRole и Qt::EditRole, для доступа к имени Qt::NomoRole.
 * @autor Василий Почкаенко.
 * @file modeloporframoj.h
 */
class ModeloPorFramoj : public QAbstractItemModel{
Q_OBJECT
private:
  //! Хранит имя открытого файла.
  QString failo;
  QDomDocument *domDok;
public:
  //! Загружает данные из указанного файла.
  void apertiFailo(QString FailaNomo);
  //! Возвращает имя файла, данные которого загружены в модель.
  /*! @return имя открытого файла или "" если ни какой файл не открыт.
   */
  inline QString proviziApertaFailo(){ return failo; };
  //! Возвращает модельный индекс элемента владеющего данной таблицей.
  QModelIndex parent( const QModelIndex & index ) const;
  //! Возвращает модельный индекс.
  QModelIndex index(
                    int row, //!< Номер строки элемента.
                    int column, //!< Номер столбца элемента.
                    const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
                   ) const;
  //! Удаляет столбцы из таблицы.
  /*!
   * @return true в случае успеха; при неудаче возвращается false.
   */
  bool removeColumns(
                     int Columns,//!< Номер первого удаляемого столбца.
                     int count, //!< Количество столбцов.
                     const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
                    );
  //! Добавляет столбцы к таблице.
  /*!
   * @return true в случае успеха; при неудаче возвращается false.
   */
  bool insertColumns(
                     int Columns, //!< Номер первого добавляемого столбца.
                     int count, //!< Количество столбцов.
                     const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
                    );
  //! Удаляет строки из таблицы.
  /*!
   * @return true в случае успеха; при неудаче возвращается false.
   */
  bool removeRows(
                  int row, //!< Номер первой удаляемой строки.
                  int count, //!< Количество строк.
                  const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
                 );
  //! Добавляет строки к таблице.
  /*!
   * @return true в случае успеха; при неудаче возвращается false.
   */
  bool insertRows(
                  int row, //!< Номер первой добавляемой строки.
                  int count, //!< Количество строк.
                  const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
                 );
  //! Устанавливает данные по индексу.
  /*!
   * @return true в случае успеха; при неудаче возвращается false.
   * @see data.
   */
  bool setData(
               const QModelIndex & index, //!< Индекс элемента.
               const QVariant & value, //!< Значение.
               int role = Qt::EditRole //!< Роль данных.
              );
  //! Возвращает количество столбцов в таблице.
  int columnCount(
                  const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
                 ) const;
  //! Возвращает количество строк в таблице.
  int rowCount(
               const QModelIndex & parent = QModelIndex() //!< Индекс элемента, владеющего данной таблицей. По умолчанию передаётся пустой индекс, означающий таблицу корневого уровня.
              ) const;
  //! Возвращает столбцов или строк таблице, в зависимости от значения role.
  /*! Предоставляется представлениям с информацией для показа в их заголовках. Информация извлекается представлениями, которые могут отобразить информацию заголовков.
   * Для строк не предоставляются заголовки. Для списка фреймов также нет заголовков. Для списка слотов предусмотрены 3 заголовка: Тип, Имя, Значение.
   */
  QVariant headerData(
                      int section, //!< Номер строки/столбца.
                      Qt::Orientation orientation, //!< Ориентация заголовка.
                      int role = Qt::DisplayRole //!< Роль данных.
                     ) const;
  //! Возвращает о элементе по индексу.
  /*! Используется другими компонентами для получения информации о каждом элементе, предоставляемом моделью.
   * см. Qt::ItemFlags в документации Qt.
   * @see data.
   */
  Qt::ItemFlags flags(
                      const QModelIndex & index //!< Индекс элемента.
                     ) const;
  //! Возвращает данные по индексу.
  /*!
   * @see flags.
   */
  QVariant data(
                const QModelIndex & index, //!< Индекс элемента.
                int role = Qt::DisplayRole //!< Роль данных.
               ) const;

  ModeloPorFramoj( QObject * parent = 0);
  ~ModeloPorFramoj();

};
#endif
